# -- coding: utf-8 --
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# -- coding: utf-8 --
import sys
import io

# 设置标准输出的编码为UTF-8
if sys.stdout.encoding != "UTF-8":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")

# 加载环境变量
load_dotenv()

# 初始化模型（复用day3_basic的配置）
model = ChatOpenAI(
    model="deepseek-chat",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com/v1",
    temperature=0.7,
)


def base_prompt_template():
    """基础提示词模板演示"""
    print("📝 基础提示词模板演示")
    print("-" * 40)
    # 创建简单的提示词模板
    prompt_template = ChatPromptTemplate.from_template(
        "你是一个{role},请用{style}风格回答这个问题：{question}"
    )

    # 格式化提示词
    formatted_prompt = prompt_template.format_messages(
        role="编程专家", style="简洁明了", question="如何学习Python？"
    )

    print("格式化后的提示词:")
    for i, message in enumerate(formatted_prompt):
        print(f"{i+1}. {message.type}: {message.content}")

    return formatted_prompt


def multi_role_prompt_template():
    """多角色提示词模板"""
    print("\n👥 多角色提示词模板演示")
    print("-" * 40)
    # 创建包含系统消息和用户消息的模板
    system_template = "你是一个{role}，请用{style}风格进行回答。"
    human_template = "{question}"

    prompt = ChatPromptTemplate.from_messages(
        [("system", system_template), ("human", human_template)]
    )

    # 测试不同的角色
    roles_styles = [
        {"role": "厨师", "style": "热情专业", "question": "如何做西红柿炒鸡蛋？"},
        {"role": "健身教练", "style": "激励性", "question": "如何开始健身？"},
        {"role": "财务顾问", "style": "专业严谨", "question": "如何规划个人理财？"},
    ]

    for config in roles_styles:
        print(f"\n🎭 角色:{config['role']} - 风格：{config['style']}")
        messages = prompt.format_messages(**config)

        # 调用模型
        response = model.invoke(messages)
        print(f"🤖 回答: {response.content}")


def template_with_examples():
    """包含示例的提示词模板"""
    print("\n📋 包含示例的提示词模板")
    print("-" * 40)

    prompt = ChatPromptTemplate.from_messages(
        [
            ("system", "你是一个情感分析助手，根据用户输入判断情感倾向。"),
            ("human", '输入："今天天气真好，心情愉快！"'),
            ("ai", "情感：积极"),
            ("human", '输入："工作压力好大，感觉很累。"'),
            ("ai", "情感：消极"),
            ("human", '输入："{user_input}"'),
        ]
    )

    test_inputs = [
        "我刚刚通过了考试，太开心了！",
        "项目失败了，感觉很失望。",
        "今天就是普通的一天。",
    ]

    for user_input in test_inputs:
        messages = prompt.format_messages(user_input=user_input)
        response = model.invoke(messages)
        print(f"输入：{user_input}")
        print(f"分析：{response.content}\n")


def test_prompt_with_model():
    """测试提示词模板与模型结合"""
    print("\n🔗 提示词模板 + 模型调用演示")
    print("-" * 40)

    # 创建专业回答模板
    prompt = ChatPromptTemplate.from_template(
        "作为{expert_type}，请用{detail_level}的详细程度解释：{topic}"
    )

    expert_configs = [
        {
            "expert_type": "计算机科学家",
            "detail_level": "通俗易懂",
            "topic": "什么是人工智能",
        },
        {
            "expert_type": "营养师",
            "detail_level": "简明扼要",
            "topic": "健康饮食的基本原则",
        },
    ]

    for config in expert_configs:
        print(f"\n🔍 专家: {config['expert_type']}")
        print(f"📚 主题: {config['topic']}")

        messages = prompt.format_messages(**config)
        response = model.invoke(messages)
        print(f"💡 回答: {response.content}")


if __name__ == "__main__":
    print("🎯 Day 3 - 提示词模板学习")
    print("=" * 50)

    # 运行各个演示函数
    base_prompt_template()
    multi_role_prompt_template()
    template_with_examples()
    test_prompt_with_model()

    print("\n🎉 提示词模板学习完成！")
